package teemo

import (
	"context"
	"log"
	"time"
)

// 全局日志记录器
var globalLogger Logger

// LogLevel log level
// LogLevel 定义日志级别类型，用于控制日志输出的详细程度
type LogLevel int

const (
	// Silent 静默级别 - 不输出任何日志
	Silent LogLevel = iota + 1
	// Error 错误级别 - 仅输出错误日志
	Error
	// Info 信息级别 - 输出信息、警告和错误日志
	Info
	// Debug 调试级别 - 输出信息、警告、错误和调试日志
	Debug
)

// Logger 定义日志接口，提供不同级别的日志记录功能
type Logger interface {
	// LogMode 设置日志级别并返回新的日志记录器
	LogMode(LogLevel) Logger
	// Infof 记录信息级别的日志，支持格式化输出
	Infof(context.Context, string, ...interface{})
	// Errorf 记录错误级别的日志，支持格式化输出
	Errorf(context.Context, string, ...interface{})
	// Slowf 记录慢请求信息，包含请求开始时间和URL
	Slowf(ctx context.Context, begin time.Time, url string)
	// Debugf 记录调试级别的日志，支持格式化输出
	Debugf(ctx context.Context, msg string, args ...interface{})
}

// SetGlobalLogger 设置全局日志记录器
func SetGlobalLogger(logger Logger) {
	globalLogger = logger
}

// SetGlobalLogLevel 设置全局日志级别
func SetGlobalLogLevel(level LogLevel) {
	globalLogger.LogMode(level)
}

func init() {
	globalLogger = NewDefaultLogger()
}

// DefaultLogger 实现默认的日志记录功能
type DefaultLogger struct {
	// level 当前日志级别
	level LogLevel
	// slowThreshold 慢请求的时间阈值
	slowThreshold time.Duration
}

// NewDefaultLogger 创建并返回一个新的默认日志记录器
// 默认日志级别为 Info，慢请求阈值为 60 秒
func NewDefaultLogger() *DefaultLogger {
	return &DefaultLogger{
		level: Info, // Change default level to Info for better debugging
		// 慢请求日志阈值
		slowThreshold: 60 * time.Second,
	}
}

// LogMode 设置日志级别并返回新的日志记录器实例
// 该方法不会修改原有记录器的设置
func (l *DefaultLogger) LogMode(level LogLevel) Logger {
	newLog := *l
	newLog.level = level
	return &newLog
}

// Debugf 记录调试级别的日志信息
// 仅当日志级别大于等于 Debug 时才会输出
func (l *DefaultLogger) Debugf(ctx context.Context, msg string, args ...interface{}) {
	if l.level >= Debug {
		log.Printf("[Debug] "+msg, args...)
	}
}

// Infof 记录信息级别的日志
// 仅当日志级别大于等于 Info 时才会输出
func (l *DefaultLogger) Infof(ctx context.Context, msg string, args ...interface{}) {
	if l.level >= Info {
		log.Printf("[Info] "+msg, args...)
	}
}

// Errorf 记录错误级别的日志
// 仅当日志级别大于等于 Error 时才会输出
func (l *DefaultLogger) Errorf(ctx context.Context, msg string, args ...interface{}) {
	if l.level >= Error {
		// 实现错误日志输出逻辑
		log.Printf("[Error] "+msg, args...)
	}
}

// Slowf 记录慢请求信息
// 当请求处理时间超过设定的阈值时，输出详细的请求信息
// 包括请求时间、处理耗时和请求URL
func (l *DefaultLogger) Slowf(ctx context.Context, begin time.Time, url string) {
	if l.level <= Silent {
		return
	}

	elapsed := time.Since(begin)

	if elapsed > l.slowThreshold {
		log.Printf("[Slow] [%s] Request took %s for URL: %s",
			time.Now().Format(time.RFC3339),
			elapsed.String(),
			url,
		)
	}
}
